package com.cskaoyan.javase.oop2.polymorphic10.introduction1;

/**
 * @description: 多态的引入
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

import java.util.Calendar;

/**
 * 什么是多态？
 * - 某同一个事物，在不同的时刻表现出不同的状态
 * 对于Java而言，同一个父类引用，当指向了不同的子类对象时，在行为表现不同
 * 这种现象就是多态
 *
 * 通过这个简单的例子，总结一下发生多态的前提：
 *  1，必须要有两个类继承 父子类
 *  2，必须发生方法的重写
 *  3，必须要有父类引用指向不同的对象
 *
 *  思考：啥情况不能发生多态？
 *  1，什么时候类不能继承？ final修饰类 绝后
 *  2，什么时候不能发生方法的重写？ final修饰的方法无法被重写，private方法没有权限也不能重写
 *      static方法的重写实际上两个类都有一份静态成员，它不是方法重写
 *      构造方法无法被继承，更不能重写
 *  3，代码需求了，你不用父类引用指向不同的对象，就发生不了多态
 *
 */
public class Demo {
    public static void main(String[] args) {
        //声明父类引用
        Phone p;
        //分别指向不同的子类对象 自动类型转换，向上转型 父类引用指向子类对象 子类对象永远可以看成时一个父类对象
        //分别调用方法
        p = new IPhone();
        p.call(); //用Siri去打电话
        p = new SamsungPhone();
        p.call(); //用键盘去打电话

    }
}
class Phone{
    String brand;
    public void call(){
    }
}

class IPhone extends Phone{
    @Override
    public void call() {
        System.out.println("用Siri去打电话");
    }
}
class SamsungPhone extends Phone{
    @Override
    public void call() {
        System.out.println("用键盘去打电话");
    }
}